#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>

// 线程终止
// 1.非正常终止：
// 1.1主线程退出return/exit()，全部线程强行终止
// 1.2子线程调用exit()，将终止整个进程
// 1.3缺省行为是终止程序的信号，将导致整个进程终止
// 2.正常终止
// 2.1从线程函数中返回return
// 2.2被统一进程中其他线程调用pthread_cancel()取消
// 2.3从线程函数中调用pthread_exit()退出，与2.1相同

int var = 0;

void *thmain1(void *arg);    // 线程主函数
void *thmain2(void *arg);    // 线程主函数

int main(int argc, char *argv[]){
    pthread_t thid1 = 0;     // 线程id
    pthread_t thid2 = 0;     // 线程id

    if(pthread_create(&thid1, NULL, thmain1, NULL) != 0){
        printf("pthread_create failed.\n");
        exit(-1);
    }
    if(pthread_create(&thid2, NULL, thmain2, NULL) != 0){
        printf("pthread_create failed.\n");
        exit(-1);
    }

    // 2.2 1) 从主线程调用pthread_cancel()退出，正常终止
    sleep(2);
    pthread_cancel(thid1);
    sleep(2);
    pthread_cancel(thid2);

    // 1.1 主线程退出，非正常终止
    // sleep(3);
    // return 0;

    // 等待子线程退出
    printf("join...\n");
    pthread_join(thid1, NULL);
    pthread_join(thid2, NULL);
    printf("join complete.\n");
    
}

void *thmain1(void *arg){
    for(int i = 0; i < 50; ++i){
        var = i+1;
        sleep(1);
        printf("pthmain1 sleep(%d) ok.\n", var);
    }
}

void *thmain2(void *arg){
    for(int i = 0; i < 50; ++i){
        sleep(1);
        printf("pthmain2 sleep(%d) ok.\n", var);
        // 2.1/2.3 子线程函数中返回
        // if(i == 2) {return (void*)1;}
        // exit(0);
    }
}